home *** CD-ROM | disk | FTP | other *** search
/ Programming an RTS Game with Direct3D / Programming an RTS Game with Direct3D.iso / Examples / Chapter 5 / Example 5.2 / mouse.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2006-07-12  |  2.8 KB  |  122 lines

  1. #include "mouse.h"
  2.  
  3. MOUSE::MOUSE()
  4. {
  5.     m_type = 0;
  6.     m_pMouseTexture = NULL;
  7.     m_pMouseDevice = NULL;
  8.     m_speed = 1.5f;
  9. }
  10.  
  11. MOUSE::~MOUSE()
  12. {
  13.     if(m_pMouseDevice != NULL)
  14.         m_pMouseDevice->Release();
  15.  
  16.     if(m_pMouseTexture != NULL)
  17.         m_pMouseTexture->Release();
  18. }
  19.  
  20. void MOUSE::InitMouse(IDirect3DDevice9* Device, HWND wnd)
  21. {
  22.     try
  23.     {
  24.         //Load texture and init sprite
  25.         D3DXCreateTextureFromFile(Device, "cursor/cursor.dds", &m_pMouseTexture);
  26.         D3DXCreateSprite(Device, &m_pSprite);
  27.  
  28.         //Get directinput object
  29.         LPDIRECTINPUT8 directInput = NULL;
  30.  
  31.         DirectInput8Create(GetModuleHandle(NULL),    // Retrieves the application handle
  32.                            0x0800,                    // v.8.0    
  33.                            IID_IDirectInput8,        // Interface ID
  34.                            (VOID**)&directInput,    // Our DirectInput Object
  35.                            NULL);
  36.  
  37.         //Acquire Default System mouse
  38.         directInput->CreateDevice(GUID_SysMouse, &m_pMouseDevice, NULL);        
  39.         m_pMouseDevice->SetDataFormat(&c_dfDIMouse);
  40.         m_pMouseDevice->SetCooperativeLevel(wnd, DISCL_EXCLUSIVE | DISCL_FOREGROUND);
  41.         m_pMouseDevice->Acquire();            
  42.  
  43.         //Get viewport size and init mouse location
  44.         D3DVIEWPORT9 v;
  45.         Device->GetViewport(&v);
  46.         m_viewport.left = v.X;
  47.         m_viewport.top = v.Y;
  48.         m_viewport.right = v.X + v.Width;
  49.         m_viewport.bottom = v.Y + v.Height;
  50.  
  51.         x = v.X + v.Width / 2.0f;
  52.         y = v.Y + v.Height / 2.0f;
  53.  
  54.         //Release Direct Input Object
  55.         directInput->Release();
  56.     }
  57.     catch(...)
  58.     {
  59.         debug.Print("Error in MOUSE::InitMouse()");
  60.     }    
  61. }
  62.  
  63. bool MOUSE::ClickLeft()
  64.     return m_mouseState.rgbButtons[0];
  65. }
  66.  
  67. bool MOUSE::ClickRight()
  68. {
  69.     return m_mouseState.rgbButtons[1];
  70. }
  71.  
  72. bool MOUSE::WheelUp()
  73. {
  74.     return m_mouseState.lZ > 0.0f;
  75. }
  76.  
  77. bool MOUSE::WheelDown()
  78. {
  79.     return m_mouseState.lZ < 0.0f;
  80. }
  81.  
  82. bool MOUSE::Over(RECT dest)
  83. {
  84.     if(x < dest.left || x > dest.right)return false;
  85.     if(y < dest.top || y > dest.bottom)return false;
  86.     return true;
  87. }
  88.  
  89. bool MOUSE::PressInRect(RECT dest)
  90. {
  91.     return ClickLeft() && Over(dest);
  92. }
  93.  
  94. void MOUSE::Update()
  95. {
  96.     //Retrieve mouse state
  97.     ZeroMemory(&m_mouseState, sizeof(DIMOUSESTATE));
  98.     m_pMouseDevice->GetDeviceState(sizeof(DIMOUSESTATE), &m_mouseState);
  99.  
  100.     //Update pointer
  101.     x += m_mouseState.lX * m_speed;
  102.     y += m_mouseState.lY * m_speed;
  103.  
  104.     //Keep mouse pointer within window
  105.     if(x < m_viewport.left)        x = m_viewport.left;
  106.     if(y < m_viewport.top)        y = m_viewport.top;
  107.     if(x > m_viewport.right)    x = m_viewport.right;
  108.     if(y > m_viewport.bottom)    y = m_viewport.bottom;
  109. }
  110.  
  111. void MOUSE::Paint()
  112. {    
  113.     if(m_pMouseTexture != NULL)
  114.     {
  115.         RECT src[] = {{0,0,20,20}, {0,20,20,40}, {20,20,40,40}, {0,40,20,60}, {20,40,40,60}};
  116.  
  117.         m_pSprite->Begin(D3DXSPRITE_ALPHABLEND);
  118.         m_pSprite->Draw(m_pMouseTexture, &src[m_type], NULL, &D3DXVECTOR3(x, y, 0.0f), 0xffffffff);
  119.         m_pSprite->End();
  120.     }    
  121. }